#ifndef SIMULATOR_H
#define SIMULATOR_H

#include <QObject>
#include "simulatorcmd.h"
#include "dev/serialPort/serialport.h"
#include "tools/datafilter.h"
#include <QTimer>

/**
 * @brief The Simulator class
 *
 * 这个是对节点的模拟，使上层可以工作
 */

class Simulator : public QObject
{
    Q_OBJECT
public:
    explicit Simulator(QObject *parent = 0);
    ~Simulator();
signals://信号都是拷贝的实际的控制模块那边的
    void sig_realTimeInfo(const QString &info);
    /**
     * @brief sig_sensorData 发送给view层显示传感器实时数据
     * @param address 传感器地址
     * @param value 实时数据
     */
    void sig_sensorData(const QString& address,int value);
    /**
     * @brief sig_sensorData 发送给view层显示传感器实时数据
     * @param name 设备名
     * @param value 数值
     */
    void sig_sensorData(ushort name, int flag, int value);
    /**
     * @brief sig_items 发送给类表项
     * @param adress  地址
     * @param name 设备名
     * @param value 值
     * @param flag 数据标识
     */

    void sig_items(const QString& adress, int name, int value, int flag);


    /**
     * @brief sig_netTopologyBuild 发送给网络拓扑的部分来建立网络
     * @param data 约定的表示格式
     */
    void sig_netTopologyBuild(const QString& data);
    /**
     * @brief sig_netTopologyBuild 发送给网络拓扑的部分来建立网络
     * @param addr 节点地址
     * @param parentAddr 父节点地址
     * @param name 节点名
     */
    void sig_netTopologyBuild(char type,const QString &addr,const QString &parentAddr,ushort name);
    /**
     * @brief sig_netTopologyTest 发送给网络拓扑的部分来监测网络
     * @param address 传感器地址
     */
    void sig_netTopologyTest(const QString& address);
    /**
     * @brief sig_netTopologyTest 发送给网络拓扑的部分来监测网络反馈的信息，说明节点未丢失
     * @param addr 节点地址
     * @param name 设备名
     */
    void sig_netTopologyTest(const QString &addr, ushort name);

    /**
     * @brief sig_badData 不正常的数据需要通过信息发送出去，需要添加一下相关的节点的信息
     * @param name 设备名
     * @param flag 数据分类标识
     * @param value bad值
     *
     *
     */

    void sig_badData(ushort name,int flag,int value);

    /**
     * @brief sig_clear0
     * @param name
     */
    void sig_clear0(ushort name);

public slots:
    /**
     * @brief slt_addAfilte 添加一个过滤的策略
     * @param f 策略
     */
    void slt_addAfilte(const Filter &f);


    ///
    /// \brief SltStart 控制扫描定时器
    ///
    void SltStart();
    ////
    /// \brief SltStop
    ///
    void SltStop();

protected slots:
    /**
     * @brief SltScan 定时扫描命令列表执行命令
     */
    void SltScan();
private:

    typedef QList<SimulatorCmd> type_cmds;
    //命令列表
    type_cmds m_Cmds;


    /**
     * @brief m_dataFilter 一个过滤器
     */
    DataFilter m_dataFilter;


    QTimer m_timer;

    /**
     * @brief help_parse 解析文件产生命令
     */
    void help_parse();

    /**
     * @brief help_deleteTimeOutCmds 删除不循环超时的cmd
     */
    void help_deleteTimeOutCmds();



    /**
     * @brief help_doData 处理SerialPortData数据
     * @param serialPortData_
     */
    void help_doData(const SerialPortData& serialPortData_);

    /**
     * @brief sersor 对与传感节点的处理
     * @param data 去除标识的内容
     */
    void sersor(int flag,const QByteArray& data);
    /**
     * @brief netTopologyBuild 对与网络产生的处理
     * @param data 去除标识的内容
     */
    void netTopologyBuild(char type, const QByteArray &data);
    /**
     * @brief netTopologyTest 对与测试产生的处理
     * @param data 去除标识的内容
     */
    void netTopologyTest(const QByteArray &data);




};

SerialPortData SimulatorCmd2SerialPortData(const SimulatorCmd& cmd_);

#endif // SIMULATOR_H
